package Entidades.informes;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 
 * @author Gabriel
 */
public class InformePdf extends Informe{
    private Document document;
    private PdfPTable tabla;

    private final int SIZE_TITULO= 22;
    private final int SIZE_SUBTITULO= 18;
    private final int SIZE_PARRAFO= 14;
    private final int SIZE_DESCRIPCION= 10;

    private int nroTabla= 1;

    public InformePdf(String dir) throws DocumentException, FileNotFoundException{
        document= new Document();
        PdfWriter.getInstance(document, new FileOutputStream(dir));
        document.open();
    }

    public boolean agregarTitulo(String texto){
        if(texto != null && texto.isEmpty()) return false;
        return agregarTexto(texto, "arial", SIZE_TITULO, Font.ITALIC, BaseColor.BLACK, Paragraph.ALIGN_CENTER);
    }

    public boolean agregarSubTitulo(String texto){
        if(texto != null && texto.isEmpty()) return false;
        return agregarTexto(texto, "arial", SIZE_SUBTITULO, Font.ITALIC, BaseColor.BLACK, Paragraph.ALIGN_LEFT);
    }

    public boolean agregarParrafo(String texto){
        if(texto != null && texto.isEmpty()) return false;
        return agregarTexto(texto, "arial", SIZE_PARRAFO, Font.ITALIC, BaseColor.BLACK, Paragraph.ALIGN_JUSTIFIED);
    }

    public boolean agregarTabla(String titulo, String columnas[], String filas[], String contenido[][], String descripcion){
        int col= (filas == null)? columnas.length : columnas.length + 1;
        tabla= new PdfPTable(col);

        agregarTituloTabla(titulo, col);

        if(filas != null){
            PdfPCell columna= null;
            columna= new PdfPCell();
            columna.setHorizontalAlignment(Element.ALIGN_CENTER);
            columna.setBackgroundColor(BaseColor.LIGHT_GRAY);
            tabla.addCell(columna);
        }
        agregarColumnasTabla(columnas);

        if(filas != null){
            PdfPCell fila= null;
            for(int i= 0; i<contenido.length; i++){
                fila = new PdfPCell(new Paragraph(filas[i]));
                fila.setHorizontalAlignment(Element.ALIGN_CENTER);
                fila.setBackgroundColor(BaseColor.LIGHT_GRAY);
                tabla.addCell(fila);
                for(int j= 0; j<contenido[i].length; j++){
                    tabla.addCell(contenido[i][j]);
                }
            }
        }else{
            for(int i= 0; i<contenido.length; i++)
                for(int j= 0; j<contenido[i].length; j++)
                    tabla.addCell(contenido[i][j]);
        }
        
        return cerrarTabla(descripcion);
    }

    public boolean agregarTabla(String titulo, String columnas[], String filas[], double contenido[][], String descripcion){
        String cont[][]= new String[contenido.length][contenido[0].length];

        for(int i= 0; i<cont.length; i++)
            for(int j= 0; j<cont[i].length; j++)
                cont[i][j]= String.valueOf(contenido[i][j]);
        
        return agregarTabla(titulo, columnas, filas, cont, descripcion);
    }

    public boolean agregarImagen(String dirImagen){
        if(dirImagen == null || dirImagen.isEmpty()) return false;
        try{
            Image imagen= Image.getInstance(dirImagen);
            imagen.scaleAbsolute(600, 150);
            imagen.setAlignment(Image.ALIGN_CENTER);
            document.add(imagen);
        }catch(IOException ex){
            cerrarEdicionDocumento();
            return false;
        }catch(Exception ex){
            cerrarEdicionDocumento();
            return false;
        }
        return true;
    }

    public void agregarAutor(String autor){
        document.addAuthor(autor+" by Promethee Resolver");
    }

    public void agregarDescripcion(String descripcion){
        document.addSubject(descripcion);
    }

    public void nuevaPagina(){
        document.newPage();
    }

    public void cerrarEdicionDocumento(){
        document.close();
    }

    /**************************** METODOS PRIVADOS ****************************/
    private boolean agregarTexto(String texto, String letra, int size, int tipoLetra, BaseColor color, int alineacion){
        Paragraph txt= new Paragraph(texto, FontFactory.getFont(letra, size, tipoLetra, color));
        txt.setAlignment(alineacion);
        try{
            document.add(txt);
        }catch(DocumentException ex){
            cerrarEdicionDocumento();
            return false;
        }
        return true;
    }

    private void agregarTituloTabla(String titulo, int n){
        if(titulo != null){
            PdfPCell title= new PdfPCell(new Paragraph(titulo));
            title.setColspan(n);
            title.setHorizontalAlignment(Element.ALIGN_CENTER);
            title.setBackgroundColor(BaseColor.GRAY);
            tabla.addCell(title);
        }
    }

    private void agregarColumnasTabla(String columnas[]){
        PdfPCell columna= null;
        for(int i=0; i<columnas.length; i++){
            columna= new PdfPCell(new Paragraph(columnas[i]));
            columna.setHorizontalAlignment(Element.ALIGN_CENTER);
            columna.setBackgroundColor(BaseColor.LIGHT_GRAY);
            tabla.addCell(columna);
        }
    }

    private boolean cerrarTabla(String descripcion){
        tabla.setHorizontalAlignment(PdfPTable.ALIGN_CENTER);

        try{
            document.add(Chunk.NEWLINE);
            document.add(tabla);
            if(descripcion != null)
                agregarTexto("Tabla " + nroTabla +": " + descripcion, "arial", SIZE_DESCRIPCION, Font.ITALIC, BaseColor.DARK_GRAY, Paragraph.ALIGN_CENTER);
            document.add(Chunk.NEWLINE);
            nroTabla++;
        }catch(Exception ex){
            cerrarEdicionDocumento();
            return false;
        }
        return true;
    }
}
